home *** CD-ROM | disk | FTP | other *** search
/ Computer Inter@ctive 16 / Computer Interactive cdrom 16 - dic 98.iso / zdnetit / content / CLASSBLD.ZIP / Include / CB_Single.h < prev    next >
Encoding:
C/C++ Source or Header  |  1998-02-20  |  4.1 KB  |  141 lines

  1. #ifndef CB_SINGLE_H
  2. #define CB_SINGLE_H
  3.  
  4. #include <assert.h>
  5.  
  6. // defines for include files
  7. #define RELATION_SINGLE_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  8. public:\
  9.     ClassTo* _ref##NameTo;\
  10. \
  11. public:\
  12.     void Add##NameTo(ClassTo* item);\
  13.     void Remove##NameTo(ClassTo* item);\
  14.     void Move##NameTo(ClassTo* item);\
  15.     void Replace##NameTo(ClassTo* item, ClassTo* newItem);\
  16.     ClassTo* Get##NameTo() { return _ref##NameTo; };
  17.  
  18. #define RELATION_SINGLE_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  19. public:\
  20.     ClassFrom* _ref##NameFrom;\
  21. \
  22. public:\
  23.     ClassFrom* Get##NameFrom() { return _ref##NameFrom; };
  24.  
  25. // defines implementation
  26. #define INIT_SINGLE_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  27.     _ref##NameTo = (ClassTo*)0;
  28.  
  29. #define EXIT_SINGLE_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  30.     if (_ref##NameTo)\
  31.         Remove##NameTo(_ref##NameTo);
  32.  
  33. #define REPLACE_SINGLE_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  34.     _ref##NameTo = pOld->_ref##NameTo;\
  35.     pOld->_ref##NameTo = (ClassTo*)0;\
  36.     if (_ref##NameTo)\
  37.         _ref##NameTo->_ref##NameFrom = this;
  38.  
  39. #define INIT_SINGLE_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  40.     _ref##NameFrom = (ClassFrom*)0;
  41.  
  42. #define EXIT_SINGLE_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  43.     assert(this);\
  44.     if (_ref##NameFrom)\
  45.     {\
  46.         assert(_ref##NameFrom->_ref##NameTo == this);\
  47. \
  48.         _ref##NameFrom->_ref##NameTo = (ClassTo*)0;\
  49.         _ref##NameFrom = (ClassFrom*)0;\
  50.     }
  51.  
  52. #define REPLACE_SINGLE_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  53.     assert(this);\
  54.     assert(pOld);\
  55.     if (pOld->_ref##NameFrom)\
  56.     {\
  57.         assert(pOld->_ref##NameFrom->_ref##NameTo == pOld);\
  58. \
  59.         _ref##NameFrom = pOld->_ref##NameFrom;\
  60.         _ref##NameFrom->_ref##NameTo = this;\
  61.         pOld->_ref##NameFrom = (ClassFrom*)0;\
  62.     }\
  63.     else\
  64.         _ref##NameFrom = (ClassFrom*)0;
  65.  
  66. #define METHODS_SINGLE_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  67. void ClassFrom##::Add##NameTo(ClassTo* item)\
  68. {\
  69.     METHOD_SINGLE_ADD(ClassFrom, NameFrom, ClassTo, NameTo) \
  70. }\
  71. \
  72. void ClassFrom##::Remove##NameTo(ClassTo* item)\
  73. {\
  74.     METHOD_SINGLE_REMOVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  75. }\
  76. \
  77. void ClassFrom##::Move##NameTo(ClassTo* item)\
  78. {\
  79.     METHOD_SINGLE_MOVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  80. }\
  81. \
  82. void ClassFrom##::Replace##NameTo(ClassTo* item, ClassTo* newItem)\
  83. {\
  84.     METHOD_SINGLE_REPLACE(ClassFrom, NameFrom, ClassTo, NameTo) \
  85. }
  86.  
  87. #define METHOD_SINGLE_ADD(ClassFrom, NameFrom, ClassTo, NameTo) \
  88.     assert(this);\
  89.     assert(_ref##NameTo == (ClassTo*)0);\
  90.     assert(item);\
  91.     assert(item->_ref##NameFrom == (ClassFrom*)0);\
  92. \
  93.     item->_ref##NameFrom = this;\
  94.     _ref##NameTo = item;
  95.  
  96. #define METHOD_SINGLE_REMOVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  97.     assert(this);\
  98.     assert(_ref##NameTo == item);\
  99.     assert(item);\
  100.     assert(item->_ref##NameFrom == this);\
  101. \
  102.     item->_ref##NameFrom = (ClassFrom*)0;\
  103.     _ref##NameTo = (ClassTo*)0;
  104.  
  105. #define METHOD_SINGLE_MOVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  106.     assert(item);\
  107.     assert(item->_ref##NameFrom);\
  108.     item->_ref##NameFrom->Remove##NameTo(item);\
  109.     Add##NameTo(item);
  110.  
  111. #define METHOD_SINGLE_REPLACE(ClassFrom, NameFrom, ClassTo, NameTo) \
  112.     assert(this);\
  113.     assert(_ref##NameTo == item);\
  114.     assert(item);\
  115.     assert(item->_ref##NameFrom == this);\
  116.     assert(newItem);\
  117.     assert(newItem->_ref##NameFrom == (ClassFrom*)0);\
  118. \
  119.     item->_ref##NameFrom = (ClassFrom*)0;\
  120.     newItem->_ref##NameFrom = this;\
  121.     _ref##NameTo = newItem;
  122.  
  123. #define METHODS_SINGLE_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  124.  
  125. #define WRITE_SINGLE_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  126.     if (Get##NameTo())\
  127.         rCArchive << Get##NameTo()->_index;\
  128.     else\
  129.         rCArchive << int(0);
  130.  
  131. #define READ_SINGLE_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  132.     {\
  133.         int index;\
  134. \
  135.         rCArchive >> index;\
  136.         if (index && !Get##NameTo())\
  137.             Add##NameTo((ClassTo*)(pointerArray[index]));\
  138.     }
  139.  
  140. #endif
  141.